package com.ling.sbbyyds.networktools;

import com.alibaba.fastjson.JSON;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;


/**
 * 天道酬勤、学无止境
 *
 * @Description 网络请求工具类
 * @author ling
 * @date 2022年06月12日
 */
@Component
public class SpringBootHttpUtil {
    private final RestTemplate restTemplate;


    public SpringBootHttpUtil() {
        restTemplate = new RestTemplate();

        if (ObjectUtils.isEmpty(restTemplate) || ObjectUtils.isEmpty(restTemplate.getMessageConverters())) {
            return;
        }

        List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
        for (int i = 0; i < messageConverters.size(); i++) {
            HttpMessageConverter<?> httpMessageConverter = messageConverters.get(i);
            if (httpMessageConverter.getClass().equals(StringHttpMessageConverter.class)) {
                messageConverters.set(i, new StringHttpMessageConverter(StandardCharsets.UTF_8));
            }
        }
    }

    /**
     *  GET请求
     *  参数：
     *  url  : 请求路径
     *  data : 请求参数
     *  headers : 需要添加的请求头
     */
    public String get(String url,Map<String,Object> data, HttpHeaders headers){
        try {
            // 将参数拼接进url
            if ( data!= null ){
                StringBuilder urlBuilder = new StringBuilder(url + "?");
                for (String k : data.keySet()) {
                    urlBuilder.append(k).append("=").append(data.get(k)).append("&");
                }
                url = urlBuilder.toString();
            }

            return restTemplate
                    .exchange(  url,
                            HttpMethod.GET,
                            new HttpEntity<>(data, headers),
                            String.class)
                    .getBody();

        }catch(Exception e){
            e.printStackTrace();
            return null;
        }}

    /**
     *  POST请求
     *  参数：
     *  url  : 请求路径
     *  data : 请求参数
     *  headers : 需要添加的请求头
     */
    public String post(String url,Map<String,Object> data, HttpHeaders headers){
        try {

            return restTemplate
                    .exchange(  url,
                            HttpMethod.POST,
                            new HttpEntity<>(data, headers),
                            String.class)
                    .getBody();

        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    /**
     *  POST请求
     *  参数：
     *  url  : 请求路径
     *  data : 请求参数
     *  headers : 需要添加的请求头
     */
    public String postObjData(String url,Object data, HttpHeaders headers){
        try {

            return restTemplate
                    .exchange(  url,
                            HttpMethod.POST,
                            new HttpEntity<>(data, headers),
                            String.class)
                    .getBody();

        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    /**
     *  POST请求
     *  参数：
     *  url  : 请求路径
     *  data : 请求参数
     *  headers : 需要添加的请求头
     */
    public String postToJson(String url,Object data, HttpHeaders headers){
        try {
            return restTemplate
                    .exchange(  url,
                            HttpMethod.POST,
                            new HttpEntity<>(JSON.toJSON(data), headers),
                            String.class)
                    .getBody();

        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    /**
     *  POST请求
     *  参数：
     *  url  : 请求路径
     *  data : 请求参数
     *  headers : 需要添加的请求头
     */
    public byte[] postToJsonDataByteResponse(String url,Object data, HttpHeaders headers){
        try {
            return restTemplate
                    .exchange(url,
                            HttpMethod.POST,
                            new HttpEntity<>(JSON.toJSON(data), headers),
                            byte[].class)
                    .getBody();

        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
}